1. 스프링 시큐리티
스프링 시큐리티?
스프링 시큐리티는 스프링 기반의 애플리케이션에서 보안을 담당하는 프레임워크로서, 다음과 같은 기능을 제공합니다.
- 인증(Authentication) : 사용자가 누구인지 확인하는 과정
- 인가(Authorization) : 사용자에게 허용된 권한을 설정하는 과정
- 다양한 인증 방식 지원 : 폼 인증, HTTP Basic/Digest 인증, OAuth2, LDAP 등
- 사용자 정의 권한 처리 : 사용자가 가지는 권한을 세밀하게 관리 가능
- 보안 설정 : HTTPS, 쿠키 보안 등 다양한 보안 설정 기능
스프링 시큐리티 설정
- Gradle 설정
- 기본적으로 해당 기능을 추가하면 스프링에서 로그인을 구현한다.
- 프롬포트에 userpassword가 출력된다.
- 기본적으로 제공하는 기능을 오버라이딩 해서 커스터마이징 해주어야 한다.
- SpringSecurity 오버라이딩
- 현재는 모든 요청에 인증을 필요로 했지만 configure에 아무 동작도 하지 않으면 요청에 인증을 요구하지 않는다.
- BCryptPasswordEncoder을 빈으로 등록해서 해시 함수를 이용하여 고객 비밀번호를 암호화하여 저장합니다.
- 해당 페이지에서 스프링 시큐리티에 대한 설정을 한다고 보면 됩니다.
2. 로그인 커스터마이징 실습
등급 설정하기
- 관리자, 유저를 구분합니다.
MemberDto 생성
회원가입 화면으로부터 넘어오는 정보를 담을 dto를 생성
- 이름, 이메일, 비밀번호, 주소 등을 담습니다.
Member 엔티티 생성
- 각각 컬럼별로 특징을 가지도록 했습니다.
- id 같은 경우에는 ID 속성을
- Email 같은 경우에는 중복이 되면 안되므로 unique 옵션을 주었습니다.
- enum 같은 경우에는 사용할 때 기본적으로 순서가 저장됩니다. 하지만 enum의 순서가 바뀌면 문제가 될 수 있음으로 String으로 저장합니다.
- 마지막으로 멤버 엔티티에 회원을 생성하는 메소드를 만들어서 관리를 합니다. 이렇게 하면 코드가 변경되어도 한군데만 수정하면 됩니다.
MemberRepository 생성
- 이메일 중복 체크를 위해서 findByEmail 메서드를 생성합니다.
MemberService 생성
- 중복 체크 로직을 넣어서 회원 가입 시 이메일 중복이 되지 않도록 합니다.
- @Transactional 로직을 사용하면 로직을 처리하다가 에러가 발생하였다면 변경된 데이터를 로직을 수행하기 이전 상태로 콜백 시켜줍니다.
- 비즈니스 로직을 담당하는 서비스 계층 클래스에 Transactional 어노테이션을 선언해 주었습니다.
테스트
회원가입 컨트롤러 작성
- 기본적으로 get방식으로 접근했을 때는 회원가입 폼을 로드하도록 한다
- post 방식의 경우 파라미터에서 전달 받은 값을 memberFromDto 객체로 받고 검증한다.
- 기본적으로 savemember 로직에서 실패할 시 IllegalStateException이 터짐으로 에러 핸들링 처리를 해당 에러로 처리한다.
- 정상적으로 회원가입이 되었을 경우 /경로로 redirect 한다.
main controller
main.html
MemberForm.html
- 현재 끝단에 hidden value로 csrf 토큰을 사용하도록 되어있다.
- Spring security config page에서disable() 해주면 지워줘도 된다.
입력 값 검증
@Valid 어노테이션을 사용하면 입력 값 검증을 할 수 있습니다. 해당 설정을 하기 위해서 MemberFromDto를 수정해 보도록 합니다. 그전에 패키지를 추가합니다.
이후 memberFromDto 클래스를 수정합니다.
- 이렇게되면 파라미터에서 데이터가 넘어올 때 검증할 수 있습니다.